package com.wise.blockingque.delayqueue;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * 存放到DelayQueue的元素必须实现Delayed接口。Delayed接口使对象成为延时对象，
 * 它使存放在DelayQueue类中的对象具有了激活日期。
 * <p>
 * 消息体定义 实现Delayed接口就是实现两个方法即compareTo和getDelay
 * 其中最重要的就是getDelay方法，这个方法用来判断是否到期
 */
public class Message implements Delayed {
    private int id;
    private String body;//消息内容
    private long executeTime;//延迟时长，这个是必须的属性（因为要按照这个来判断延时时长）

    public Message(int id, String body, long executeTime) {
        this.id = id;
        this.body = body;
        this.executeTime = TimeUnit.NANOSECONDS.convert(executeTime, TimeUnit.MILLISECONDS) + System.nanoTime();
    }

    public int getId() {
        return id;
    }

    public String getBody() {
        return body;
    }

    public long getExecuteTime() {
        return executeTime;
    }

    /**
     * 延时任务是否到时就是按照这个方法判断如果返回的是负数则说明到期否则没到期
     *
     * @param unit
     * @return
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(this.executeTime - System.nanoTime(), TimeUnit.NANOSECONDS);
    }

    /**
     * 自定义实现比较方法 返回 1 0 -1三个参数
     *
     * @return
     */
    @Override
    public int compareTo(Delayed delayed) {
        Message msg = (Message) delayed;
        return this.id > msg.id ? 1 : (this.id < msg.id ? -1 : 0);
    }
}
